#ifndef SIGNALDATA_H
#define SIGNALDATA_H

#include <qrect.h>
#include "privatedata.h"
#include "isi.h"
#include "globalvar.h"


/**
 * @brief The SignalData class          интерфейс работы с данными (чтение и запись)
 */
class PrivateData;
class SignalData
{
public:


    /**
     * @brief instance                  доступ к данным параметра через прослойку
     * @return                          возвращает ссылку на прослойку параметра
     */
    static SignalData &instance();
    /**
     * @brief append                    запись точек в PrivateData для хранения
     * @param point                     точка для записи
     */
    void append(int index, const QPointF &point);
    /**
     * @brief append                    добавление по точке для каждого параметров, из файла isi, после последней отображенной точки
     * @param elapsed                   время последней отображенной точки
     */
    void append(double elapsed);
    /**
     * @brief clearStaleValues          очистка данных, которые не будут отображаться на графике
     * @param min                       граница до которой очищаются данные
     * @param index                     номер PrivateData из вектора d_vectorData
     */
    void clearStaleValues(double min, int index);
    /**
     * @brief size                      количество точек, записанных в PrivateData
     * @param index                     номер PrivateData из вектора d_vectorData
     * @return
     */
    int size(int index) const;
    /**
     * @brief value                     получить из PrivateData точку (с коородинатами x,y) по индексу
     * @param index                     индекс
     * @return
     */
    QPointF value(int index, int i) const;
    /**
     * @brief boundingRect              получить область видимости графика
     * @return
     */
    QRectF boundingRect(int index) const;
    /**
     * @brief lock                      закрыть данные PrivateData для чтения/записи
     */
    void lock(int index);
    /**
     * @brief unlock                    открыть данные PrivateData для чтения/записи
     */
    void unlock(int index);

    /**
     * @brief setPath                   назначить путь к файлу базы данных
     * @param path                      путь к файлу базы данных
     */
    void setPath(const QString &path);
    /**
     * @brief setCountParam             назначить количество параметров
     * @param countParam
     */
    void setCountParam(const int countParam);
    /**
     * @brief initData                  инициировать вектор из PrivateData
     */
    void initData();

    /**
     * @brief setNumConnection          назначить номер подключения к базе данных
     * @param numConnection             номер подключения
     */
    void setNumConnection(int numConnection=1);

    /**
     * @brief getNameParam              получить название параметра по индексу
     * @param index                     индекс парметра
     * @return                          вернет название параметра
     */
    QString getNameParam(int index);

    /**
     * @brief d_flag                    флаг об окончании файла
     */
    bool d_flag;
    /**
     * @brief getFlag                   получить флаг
     * @return
     */
    bool getFlag();
    /**
     * @brief setFlag                   назначить значение флага
     * @param flag                      значение
     */
    void setFlag(bool flag = true );


private:
    /**
     * @brief d_vectorData              набор с данными(PrivateData) для каждого параметра
     */
    QVector<PrivateData *> d_vectorData;
    /**
     * @brief d_path                    путь к базе данных
     */
    QString d_path;
    /**
     * @brief d_countParam              количество параметров
     */
    int d_countParam;
    /**
     * @brief d_numConnection           номер подключения
     */
    int d_numConnection;
    /**
     * @brief SignalData                конструктор
     */
    SignalData();
    /**
     * @brief SignalData                конструктор копирования
     * @param data
     */
    SignalData(const SignalData & data);
    /**
     * @brief operator=                 перегрузка оператора=
     * @return
     */
    SignalData &operator=(const SignalData &);
    virtual ~SignalData();
    /**
     * @brief clear                     очистить вектор d_vectorData
     */
    void clear();
};

#endif // SIGNALDATA_H
